///
/// 用于显示徽标数、小红点等提示信息

// ignore_for_file: dangling_library_doc_comments

import 'package:flutter/material.dart';
import '../../core/elegance_theme.dart';
import 'e_text.dart';

/// 徽标形状枚举
enum BadgeShape {
  /// 圆形（四角均为圆角）
  circle,
  
  /// 直角（左下角为直角）
  horn,
}

/// 数字显示方式枚举
enum NumberDisplayType {
  /// 超过max显示{max}+
  overflow,
  
  /// 超过max显示{max}...
  ellipsis,
  
  /// 超过1000显示k/w单位
  limit,
}

/// 主题类型枚举
enum BadgeType {
  /// 错误/红色
  error,
  
  /// 警告/黄色
  warning,
  
  /// 成功/绿色
  success,
  
  /// 主要/蓝色
  primary,
  
  /// 信息/灰色
  info,
}

/// 徽标组件
class EBadge extends StatelessWidget {
  /// 创建徽标组件
  const EBadge({
    super.key,
    this.child,
    this.value,
    this.isDot = false,
    this.show = true,
    this.max = 99,
    this.type = BadgeType.error,
    this.showZero = false,
    this.bgColor,
    this.color = Colors.white,
    this.shape = BadgeShape.circle,
    this.numberType = NumberDisplayType.overflow,
    this.offset = const [0, 0],
    this.inverted = false,
    this.absolute = false,
    this.textStyle,
  });

  /// 子组件（徽标会显示在子组件的右上角）
  final Widget? child;
  
  /// 显示的数字，大于max时根据numberType显示不同内容
  final dynamic value;
  
  /// 是否只显示一个圆点，不展示数字
  final bool isDot;
  
  /// 是否显示徽标
  final bool show;
  
  /// 最大值，超过最大值会根据numberType显示不同内容
  final int max;
  
  /// 主题类型
  final BadgeType type;
  
  /// 当数值为0时，是否展示徽标
  final bool showZero;
  
  /// 背景颜色，优先级比type高
  final Color? bgColor;
  
  /// 字体颜色
  final Color color;
  
  /// 徽标形状
  final BadgeShape shape;
  
  /// 数字的显示方式
  final NumberDisplayType numberType;
  
  /// 设置徽标的位置偏移，格式为[x, y]
  final List<double> offset;
  
  /// 是否反转背景和字体颜色
  final bool inverted;
  
  /// 是否绝对定位
  final bool absolute;
  
  /// 自定义文本样式
  final TextStyle? textStyle;

  @override
  Widget build(BuildContext context) {
    // 获取主题
    final theme = EleganceTheme.of(context);
    
    // 不显示徽标的情况
    if (!show || (!showZero && value is num && value == 0) || (!showZero && value == '0')) {
      return child ?? const SizedBox();
    }
    
    // 构建徽标内容
    Widget? badgeContent;
    if (isDot) {
      // 只显示圆点
      badgeContent = _buildDotBadge(theme);
    } else {
      // 显示数字或文本
      badgeContent = _buildValueBadge(theme);
    }
    
    // 如果没有子组件，直接返回徽标
    if (child == null) {
      return badgeContent;
    }
    
    // 有子组件时，将徽标定位在子组件右上角
    return Stack(
      clipBehavior: Clip.none,
      alignment: Alignment.center,
      children: [
        child!, 
        Positioned(
          top: absolute ? offset[0] : -4,
          right: absolute ? offset[1] : -4,
          child: badgeContent,
        ),
      ],
    );
  }

  /// 构建圆点徽标
  Widget _buildDotBadge(EleganceThemeData theme) {
    return Container(
      width: 8,
      height: 8,
      decoration: BoxDecoration(
        color: _getBadgeColor(theme),
        borderRadius: BorderRadius.circular(4),
      ),
    );
  }

  /// 构建带值的徽标
  Widget _buildValueBadge(EleganceThemeData theme) {
    final displayValue = _formatValue(value);
    final badgeColor = _getBadgeColor(theme);
    final textColor = inverted ? badgeColor : color;
    final bgColor = inverted ? color : badgeColor;
    
    // 根据形状设置圆角
    double borderRadius;
    if (shape == BadgeShape.circle) {
      borderRadius = 10;
    } else {
      borderRadius = 0;
    }
    
    // 根据内容计算宽度
    double minWidth = 20;
    if (displayValue.length > 2) {
      minWidth = 0;
    }
    
    return Container(
      padding: const EdgeInsets.symmetric(horizontal: 4),
      constraints: BoxConstraints(
        minWidth: minWidth,
        minHeight: 20,
      ),
      decoration: BoxDecoration(
        color: bgColor,
        borderRadius: BorderRadius.circular(borderRadius),
      ),
      alignment: Alignment.center,
      child: EText(
        displayValue,
        size: textStyle?.fontSize ?? 12,
        color: textColor,
        bold: textStyle?.fontWeight == FontWeight.bold ?? true,
      ),
    );
  }

  /// 获取徽标颜色
  Color _getBadgeColor(EleganceThemeData theme) {
    if (bgColor != null) {
      return bgColor!;
    }
    
    switch (type) {
      case BadgeType.primary:
        return theme.primaryColor;
      case BadgeType.success:
        return theme.successColor;
      case BadgeType.warning:
        return theme.warningColor;
      case BadgeType.error:
        return theme.errorColor;
      case BadgeType.info:
        return theme.infoColor;
      default:
        return theme.errorColor;
    }
  }

  /// 格式化显示的值
  String _formatValue(dynamic inputValue) {
    if (inputValue == null) {
      return '';
    }
    
    String valueStr = inputValue.toString();
    
    // 尝试转换为数字进行处理
    if (num.tryParse(valueStr) != null) {
      final numValue = num.parse(valueStr);
      
      switch (numberType) {
        case NumberDisplayType.overflow:
          return numValue > max ? '$max+' : valueStr;
        case NumberDisplayType.ellipsis:
          return numValue > max ? '$max...' : valueStr;
        case NumberDisplayType.limit:
          if (numValue >= 10000) {
            return '${(numValue / 10000).toStringAsFixed(1)}w';
          } else if (numValue >= 1000) {
            return '${(numValue / 1000).toStringAsFixed(1)}k';
          } else {
            return valueStr;
          }
      }
    }
    
    return valueStr;
  }
}